/**
 * 权限守卫
 * 处理路由权限验证、动态路由加载
 */
import { useAuthStore } from '@/stores/modules/auth'
import { useRouteStore } from '@/stores/modules/route'
import { ElMessage } from 'element-plus'
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'

// 配置进度条
NProgress.configure({ showSpinner: false })

// 白名单路由（不需要登录即可访问）
const whiteList = ['/login', '/404']

/**
 * 创建权限守卫
 * @param {Router} router Vue Router 实例
 */
export function createPermissionGuard(router) {
  router.beforeEach(async (to, from, next) => {
    // 开始进度条
    NProgress.start()
    
    const authStore = useAuthStore()
    const routeStore = useRouteStore()
    
    // 设置页面标题
    document.title = to.meta?.title ? `${to.meta.title} - Vilan Admin` : 'Vilan Admin'
    
    // 判断用户是否已登录
    const hasToken = authStore.isLoggedIn
    
    if (hasToken) {
      // 已登录
      if (to.path === '/login') {
        // 如果已登录，访问登录页则重定向到首页
        next({ path: '/' })
        NProgress.done()
      } else {
        // 判断是否已生成动态路由
        if (!routeStore.isRoutesGenerated) {
          try {
            console.log('🔄 [Permission Guard] 开始加载动态路由...')
            
            // 🎯 尝试从缓存恢复路由
            const restored = routeStore.restoreRoutesFromCache()
            
            if (!restored) {
              // 缓存恢复失败，从后端获取
              console.log('🌐 [Permission Guard] 从后端获取路由...')
              
              // 获取用户信息
              await authStore.getUserInfo()
              
              // 生成动态路由
              const accessRoutes = await routeStore.generateRoutes()
              
              console.log('✅ [Permission Guard] 动态路由加载完成:', accessRoutes.length, '条')
            }
            
            // 动态路由添加完成后，需要用 replace 重新进入，确保路由生效
            next({ ...to, replace: true })
          } catch (error) {
            console.error('❌ [Permission Guard] 加载路由失败:', error)
            
            // 加载失败，清空 token 并跳转到登录页
            authStore.resetState()
            routeStore.resetRoutes()
            ElMessage.error('加载菜单失败，请重新登录')
            next(`/login?redirect=${to.path}`)
            NProgress.done()
          }
        } else {
          // 路由已生成，直接放行
          next()
        }
      }
    } else {
      // 未登录
      if (whiteList.includes(to.path)) {
        // 在白名单中，直接放行
        next()
      } else {
        // 不在白名单中，重定向到登录页
        next(`/login?redirect=${to.path}`)
        NProgress.done()
      }
    }
  })
  
  router.afterEach(() => {
    // 完成进度条
    NProgress.done()
  })
  
  // 路由错误处理
  router.onError((error) => {
    console.error('❌ [Router Error]', error)
    NProgress.done()
    
    // 处理动态导入组件失败的情况
    if (error.message.includes('Failed to fetch dynamically imported module')) {
      ElMessage.error('页面加载失败，请刷新重试')
    }
  })
}

